/*
 * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.jmx.snmp.daemon;

// java import
//
import java.io.*;
import java.util.logging.Level;

// jmx import
//
import javax.management.MBeanServer;
import javax.management.ObjectName;

// jmx RI import
//
import static com.sun.jmx.defaults.JmxProperties.SNMP_ADAPTOR_LOGGER;

/**
 * The <CODE>ClientHandler</CODE> class is the base class of each
 * adaptor.<p>
 */

abstract class ClientHandler implements Runnable {

    public ClientHandler(CommunicatorServer server, int id, MBeanServer f, ObjectName n) {
        adaptorServer = server;
        requestId = id;
        mbs = f;
        objectName = n;
        interruptCalled = false;
        dbgTag = makeDebugTag();
        //if (mbs == null ){
        //thread = new Thread (this) ;
        thread = createThread(this);

        //} else {
        //thread = mbs.getThreadAllocatorSrvIf().obtainThread(objectName,this) ;
        //}
        // Note: the thread will be started by the subclass.
    }

    // thread service
    Thread createThread(Runnable r) {
        return new Thread(this);
    }

    public void interrupt() {
        SNMP_ADAPTOR_LOGGER.entering(dbgTag, "interrupt");
        interruptCalled = true;
        if (thread != null) {
            thread.interrupt();
        }
        SNMP_ADAPTOR_LOGGER.exiting(dbgTag, "interrupt");
    }

    public void join() {
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException x) {
            }
        }
    }

    public void run() {

        try {
            //
            // Notify the server we are now active
            //
            adaptorServer.notifyClientHandlerCreated(this);

            //
            // Call protocol specific sequence
            //
            doRun();
        } finally {
            //
            // Now notify the adaptor server that the handler is terminating.
            // This is important because the server may be blocked waiting for
            // a handler to terminate.
            //
            adaptorServer.notifyClientHandlerDeleted(this);
        }
    }

    //
    // The protocol-dependent part of the request
    //
    public abstract void doRun();

    protected CommunicatorServer adaptorServer = null;
    protected int requestId = -1;
    protected MBeanServer mbs = null;
    protected ObjectName objectName = null;
    protected Thread thread = null;
    protected boolean interruptCalled = false;
    protected String dbgTag = null;

    protected String makeDebugTag() {
        return "ClientHandler[" + adaptorServer.getProtocol() + ":" + adaptorServer.getPort() + "][" + requestId + "]";
    }
}
